Contents

These plots are inspired by GATK recommendations on hard filtering Please check the page and refer to it for further info and assistance.

1 Raw values from HaplotypeCaller

These plot show the distribution of quality control scores among the variants called by HaplotypeCaller. This caller is optimized to achieve maximum sensitivity and the results will include false positives. We will use these plots to apply two types hard filters on the data. For each of the 6 paramters we set 2 types of hard cutoffs:

1.1 Mapping Quality

This is the root mean square mapping quality over all the reads at the site. Instead of the average mapping quality of the site, this annotation gives the square root of the average of the squares of the mapping qualities at the site. It is meant to include the standard deviation of the mapping qualities. Including the standard deviation allows us to include the variation in the dataset. A low standard deviation means the values are all close to the mean, whereas a high standard deviation means the values are all far from the mean.When the mapping qualities are good at a site, the MQ will be around 60.

1.1.1 SNP

1.1.2 INDEL

1.2 Mapping Quality Rank Sum Test

This is the u-based z-approximation from the Rank Sum Test for mapping qualities. It compares the mapping qualities of the reads supporting the reference allele and the alternate allele. A positive value means the mapping qualities of the reads supporting the alternate allele are higher than those supporting the reference allele; a negative value indicates the mapping qualities of the reference allele are higher than those supporting the alternate allele. A value close to zero is best and indicates little difference between the mapping qualities.

1.2.1 SNP

1.2.2 INDEL

1.3 Quality by Depth

This is the variant confidence (from the QUAL field) divided by the unfiltered depth of non-hom-ref samples. This annotation is intended to normalize the variant quality in order to avoid inflation caused when there is deep coverage. For filtering purposes it is better to use QD than either QUAL or DP directly.

1.3.1 SNP

1.3.2 INDEL

1.4 Strand Odds Ratio

This is another way to estimate strand bias using a test similar to the symmetric odds ratio test. SOR was created because FS tends to penalize variants that occur at the ends of exons. Reads at the ends of exons tend to only be covered by reads in one direction and FS gives those variants a bad score. SOR will take into account the ratios of reads that cover both alleles.

1.4.1 SNP

1.4.2 INDEL

1.5 FisherTest Strand

This is the Phred-scaled probability that there is strand bias at the site. Strand Bias tells us whether the alternate allele was seen more or less often on the forward or reverse strand than the reference allele. When there little to no strand bias at the site, the FS value will be close to 0.

1.5.1 SNP

Warning: Transformation introduced infinite values in continuous x-axis
Warning: Removed 623071 rows containing non-finite values (stat_density).

1.5.2 INDEL

Warning: Transformation introduced infinite values in continuous x-axis
Warning: Removed 163094 rows containing non-finite values (stat_density).

1.6 Read Position Rank Sum Test

This is the u-based z-approximation from the Rank Sum Test for site position within reads. It compares whether the positions of the reference and alternate alleles are different within the reads. Seeing an allele only near the ends of reads is indicative of error, because that is where sequencers tend to make the most errors. A negative value indicates that the alternate allele is found at the ends of reads more often than the reference allele; a positive value indicates that the reference allele is found at the ends of reads more often than the alternate allele. A value close to zero is best because it indicates there is little difference between the positions of the reference and alternate alleles in the reads.

1.6.1 SNP

1.6.2 INDEL

2 Post filtering comparisons

2.1 Mapping Quality

2.1.1 SNP

The total number of variants filtered by MQ for SNP:

  • lenient: 45186 that correspond to: 2.42%

  • stringent: 99458 that correspond to: 5.34%

2.1.2 INDEL

The total number of variants filtered by MQ for INDEL:

  • lenient: 8927 that correspond to: 1.69%

  • stringent: 23983 that correspond to: 4.55%

2.2 Mapping Quality Rank Sum Test

2.2.1 SNP

The total number of variants filtered by MQRST for SNP:

  • lenient: 28713 that correspond to: 1.59%

  • stringent: 144732 that correspond to: 7.99%

2.2.2 INDEL

The total number of variants filtered by MQRST for INDEL:

  • lenient: 10584 that correspond to: 2.08%

  • stringent: 69553 that correspond to: 13.67%

2.3 Quality by Depth

2.3.1 SNP

The total number of variants filtered by QD for SNP:

  • lenient: 15658 that correspond to: 0.84%

  • stringent: 92688 that correspond to: 4.97%

2.3.2 INDEL

The total number of variants filtered by QD for SNP:

  • lenient: 3566 that correspond to: 0.68%

  • stringent: 48470 that correspond to: 9.2%

2.4 Strand Odds Ratio

2.4.1 SNP

The total number of variants filtered by SOR for SNP:

  • lenient: 32737 that correspond to: 1.76%

  • stringent: 72339 that correspond to: 3.88%

2.4.2 INDEL

The total number of variants filtered by SOR for INDEL:

  • lenient: 12113 that correspond to: 2.3%

  • stringent: 28477 that correspond to: 5.41%

2.5 FisherTest Strand

2.5.1 SNP

The total number of variants filtered by FS for SNP:

  • lenient: 8287 that correspond to: 0.44%

  • stringent: 63272 that correspond to: 3.39%

Warning: Transformation introduced infinite values in continuous x-axis
Warning: Removed 1667727 rows containing non-finite values (stat_density).

2.5.2 INDEL

The total number of variants filtered by FS for SNP:

  • lenient: -1328791 that correspond to: 0.65%

  • stringent: 29692 that correspond to: 5.64%

Warning: Transformation introduced infinite values in continuous x-axis
Warning: Removed 405841 rows containing non-finite values (stat_density).

2.6 Read Position Rank Sum Test

2.6.1 SNP

The total number of variants filtered by RST for SNP:

  • lenient: 13313 that correspond to: 0.74%

  • stringent: 79346 that correspond to: 4.39%

2.6.2 INDEL

The total number of variants filtered by RST for SNP:

  • lenient: 14690 that correspond to: 2.91%

  • stringent: 62440 that correspond to: 12.38%

LS0tCnRpdGxlOiAiR0FUSyBxdWFsaXR5IGNvbnRyb2wiCm91dHB1dDoKICAgQmlvY1N0eWxlOjpodG1sX2RvY3VtZW50OgogICAgICB0b2M6IHRydWUKICAgICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICAgIHNlbGZfY29udGFpbmVkOiB0cnVlCiAgICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgICAgaGlnaGxpZ2h0OiB0YW5nbwojYmlibGlvZ3JhcGh5OiBrbm5fbWxfaW50cm8uYmliCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQoKCmBgYHtyIHN0eWxlLCBlY2hvPUZBTFNFLCByZXN1bHRzPSJhc2lzIn0KbGlicmFyeSgia25pdHIiKQpvcHRpb25zKGRpZ2l0cyA9IDIsIHdpZHRoID0gODApCm9wdGlvbnMoYml0bWFwVHlwZSA9ICdjYWlybycpCmdvbGRlbl9yYXRpbyA8LSAoMSArIHNxcnQoNSkpIC8gMgpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgdGlkeSA9IEZBTFNFLCBpbmNsdWRlID0gVFJVRSwgY2FjaGUubGF6eSA9IEZBTFNFLAogICAgICAgICAgICAgICBkZXY9YygncG5nJywgJ3BkZicsICdzdmcnKSwgZmlnLmhlaWdodCA9IDUsIGZpZy53aWR0aCA9IDQgKiBnb2xkZW5fcmF0aW8sIGNvbW1lbnQgPSAnICAnLCBkcGkgPSAzMDApCmBgYAoKYGBge3Igc2V0dXAsIGNvbW1lbnQ9TkEsIGVjaG89RkFMU0V9Ci5saWJQYXRocyggYyggLmxpYlBhdGhzKCksICIvZy9mdXJsb25nL2Zvcm5lcmlzL3NvZnR3YXJlL1IvIikpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShnZ3RoZW1lcykKa25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy5wYXRoID0gImltYWdlcy8iKQprbml0cjo6b3B0c19jaHVuayRzZXQoY2FjaGU9VFJVRSkKb3B0aW9ucyhzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCmBgYAoKCmBgYHtyIGlucHV0LCBjb21tZW50PU5BLCBlY2hvPUZBTFNFfQpkYXRhX2ZvbGRlciA8LSAiL2cvZnVybG9uZy9wcm9qZWN0LzcxX0YxX3BhcmVudGFsX2dlbm90eXBpbmcvYW5hbHlzaXMvR0FUS192YXJpYW50X2NhbGwvcXVhbGl0eV9maWx0ZXJzLyIKCk1RX1NOUCA8LSByZWFkLnRhYmxlKHBhc3RlMChkYXRhX2ZvbGRlciwgIk1hcHBpbmdfUXVhbGl0eV9NUV9TTlBfRjEudHh0IikpCk1RX0lOREVMIDwtIHJlYWQudGFibGUocGFzdGUwKGRhdGFfZm9sZGVyLCAiTWFwcGluZ19RdWFsaXR5X01RX0lOREVMX0YxLnR4dCIpKQoKTVFSU1RfU05QIDwtIHJlYWQudGFibGUocGFzdGUwKGRhdGFfZm9sZGVyLCAiTWFwcGluZ19RdWFsaXR5X1JhbmtfU3VtX1NOUF9GMS50eHQiKSkKTVFSU1RfSU5ERUwgPC0gcmVhZC50YWJsZShwYXN0ZTAoZGF0YV9mb2xkZXIsICJNYXBwaW5nX1F1YWxpdHlfUmFua19TdW1fSU5ERUxfRjEudHh0IikpCgpRRF9TTlAgPC0gcmVhZC50YWJsZShwYXN0ZTAoZGF0YV9mb2xkZXIsICJRdWFsaXR5X0J5X0RlcHRoX1FEX1NOUF9GMS50eHQiKSkKUURfSU5ERUwgPC0gcmVhZC50YWJsZShwYXN0ZTAoZGF0YV9mb2xkZXIsICJRdWFsaXR5X0J5X0RlcHRoX1FEX0lOREVMX0YxLnR4dCIpKQoKU09SX1NOUCA8LSByZWFkLnRhYmxlKHBhc3RlMChkYXRhX2ZvbGRlciwgIlN0cmFuZF9PZGRzX1JhdGlvX1NPUl9TTlBfRjEudHh0IikpClNPUl9JTkRFTCA8LSByZWFkLnRhYmxlKHBhc3RlMChkYXRhX2ZvbGRlciwgIlN0cmFuZF9PZGRzX1JhdGlvX1NPUl9JTkRFTF9GMS50eHQiKSkKCkZTX1NOUCA8LSByZWFkLnRhYmxlKHBhc3RlMChkYXRhX2ZvbGRlciwgIkZpc2hlcl9TdHJhbmRfRlNfU05QX0YxLnR4dCIpKQpGU19JTkRFTCA8LSByZWFkLnRhYmxlKHBhc3RlMChkYXRhX2ZvbGRlciwgIkZpc2hlcl9TdHJhbmRfRlNfSU5ERUxfRjEudHh0IikpCgpSU1RfU05QIDwtIHJlYWQudGFibGUocGFzdGUwKGRhdGFfZm9sZGVyLCAiUmFua19TdW1fVGVzdF9TTlBfRjEudHh0IikpClJTVF9JTkRFTCA8LSByZWFkLnRhYmxlKHBhc3RlMChkYXRhX2ZvbGRlciwgIlJhbmtfU3VtX1Rlc3RfSU5ERUxfRjEudHh0IikpCmBgYAoKClRoZXNlIHBsb3RzIGFyZSBpbnNwaXJlZCBieSBbR0FUSyByZWNvbW1lbmRhdGlvbnMgb24gaGFyZCBmaWx0ZXJpbmddKGh0dHBzOi8vc29mdHdhcmUuYnJvYWRpbnN0aXR1dGUub3JnL2dhdGsvZG9jdW1lbnRhdGlvbi9hcnRpY2xlLnBocD9pZD02OTI1KQpQbGVhc2UgY2hlY2sgdGhlIHBhZ2UgYW5kIHJlZmVyIHRvIGl0IGZvciBmdXJ0aGVyIGluZm8gYW5kIGFzc2lzdGFuY2UuCgojIFJhdyB2YWx1ZXMgZnJvbSBIYXBsb3R5cGVDYWxsZXIKClRoZXNlIHBsb3Qgc2hvdyB0aGUgZGlzdHJpYnV0aW9uIG9mIHF1YWxpdHkgY29udHJvbCBzY29yZXMgYW1vbmcgdGhlIHZhcmlhbnRzIGNhbGxlZCBieSBIYXBsb3R5cGVDYWxsZXIuIFRoaXMgY2FsbGVyIGlzIG9wdGltaXplZCB0byBhY2hpZXZlIG1heGltdW0gc2Vuc2l0aXZpdHkgYW5kIHRoZSByZXN1bHRzIHdpbGwgaW5jbHVkZSBmYWxzZSBwb3NpdGl2ZXMuIFdlIHdpbGwgdXNlIHRoZXNlIHBsb3RzIHRvIGFwcGx5IHR3byB0eXBlcyBoYXJkIGZpbHRlcnMgb24gdGhlIGRhdGEuIEZvciBlYWNoIG9mIHRoZSA2IHBhcmFtdGVycyB3ZSBzZXQgMiB0eXBlcyBvZiBoYXJkIGN1dG9mZnM6CgoqIGxlbmllbnQ6IHRvIGluY2x1ZGUgYXMgbWFueSB0cnVlIHBvc2l0aXZlcyBhcyBwb3NzaWJsZS4gSXQgd2lsbCBzdGlsbCBpbmNsdWRlIHNvbWUgZmFsc2UgcG9zaXRpdmVzIGJ1dCBpdCBzaG91bGRuJ3QgZXhjbHVkZSB0cnVlIHBvc2l0aXZlcy4gVGhpcyBzZXQgc2hvdWxkIGJlIHVzZWQgZm9yIGRhdGEgZmlsdGVyaW5nIChlLmcuIFdBU1ApIGFuZCB3aGVuIHdlIG5lZWQgdG8gYmUgY29uc2VydmF0aXZlIGFuZCBjYXV0aW91cyBhYm91dCB2YXJpYW50IGNhbGwuIEN1dG9mZiBsaW5lcyBvbiBwbG90cyBhcmUgaW4gR1JFRU4uCgoqIHN0cmljdDogdG8gcmVtb3ZlIGFzIG1hbnkgZmFsc2UgcG9zaXRpdmVzIGFzIHBvc3NpYmxlLiBXZSBwdXQgaGFyc2ggaGFyZCBmaWx0ZXJzIG8gb3VyIDYgcGFyYW1ldGVycyB0byBleGNsdWRlIGZhbHNlIHBvc2l0aXZlcy4gV2UgZW5kIHVwIHdpdGggYW4gaGlnaCBjb25maWRlbmNlIHZhcmlhbnQgY2FsbHNldC4gV2UgZG8gdGhpcyBhdCB0aGUgY29zdCBvZiByZWplY3Rpbmcgc29tZSB0cnVlIHBvc2l0aXZlIGFzIHdlbGwuIFRoaXMgY2FuIHNldCBzaG91bGQgYmUgdXNlZCB3aGVuIGhpZ2ggY29uZmlkZW5jZSBpcyBrZXkgZm9yIHRoZSBhbmFseXNpcyAoZS5nLiBhc3NpZ25pbmcgcmVhZHMgdG8gbWF0ZXJuYWwvcGF0ZXJuYWwgYWxsZWxlKS4gQ3V0b2ZmIGxpbmVzIG9uIHBsb3RzIGFyZSBpbiBSRUQuCgojIyBNYXBwaW5nIFF1YWxpdHkKClRoaXMgaXMgdGhlIHJvb3QgbWVhbiBzcXVhcmUgbWFwcGluZyBxdWFsaXR5IG92ZXIgYWxsIHRoZSByZWFkcyBhdCB0aGUgc2l0ZS4gSW5zdGVhZCBvZiB0aGUgYXZlcmFnZSBtYXBwaW5nIHF1YWxpdHkgb2YgdGhlIHNpdGUsIHRoaXMgYW5ub3RhdGlvbiBnaXZlcyB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlIGF2ZXJhZ2Ugb2YgdGhlIHNxdWFyZXMgb2YgdGhlIG1hcHBpbmcgcXVhbGl0aWVzIGF0IHRoZSBzaXRlLiBJdCBpcyBtZWFudCB0byBpbmNsdWRlIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG1hcHBpbmcgcXVhbGl0aWVzLiBJbmNsdWRpbmcgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBhbGxvd3MgdXMgdG8gaW5jbHVkZSB0aGUgdmFyaWF0aW9uIGluIHRoZSBkYXRhc2V0LiBBIGxvdyBzdGFuZGFyZCBkZXZpYXRpb24gbWVhbnMgdGhlIHZhbHVlcyBhcmUgYWxsIGNsb3NlIHRvIHRoZSBtZWFuLCB3aGVyZWFzIGEgaGlnaCBzdGFuZGFyZCBkZXZpYXRpb24gbWVhbnMgdGhlIHZhbHVlcyBhcmUgYWxsIGZhciBmcm9tIHRoZSBtZWFuLldoZW4gdGhlIG1hcHBpbmcgcXVhbGl0aWVzIGFyZSBnb29kIGF0IGEgc2l0ZSwgdGhlIE1RIHdpbGwgYmUgYXJvdW5kIDYwLgoKIyMjIFNOUAoKYGBge3IgTVFfU05QLCBjb21tZW50PU5BLCBlY2hvPUZBTFNFfQpnZ3Bsb3QoTVFfU05QLCBhZXMoVjUpKSArIAogIGdlb21fZGVuc2l0eShjb2xvdXI9InJveWFsYmx1ZTIiLCBmaWxsPSJyb3lhbGJsdWUyIiwgYWxwaGE9MC41KSArIAogIHRoZW1lX2J3KCkgKyAKICB4bGFiKCJNYXBwaW5nIHF1YWxpdHkiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNDAsIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG91ciA9ImZvcmVzdGdyZWVuIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDU4LCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJvcmFuZ2VyZWQyIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSwgY29sb3VyID0gImJsYWNrIiksIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSkKYGBgCgoKIyMjIElOREVMCgpgYGB7ciBNUV9JTkRFTCwgY29tbWVudD1OQSwgZWNobz1GQUxTRX0KZ2dwbG90KE1RX0lOREVMLCBhZXMoVjUpKSArIAogIGdlb21fZGVuc2l0eShjb2xvdXI9InJveWFsYmx1ZTIiLCBmaWxsPSJyb3lhbGJsdWUyIiwgYWxwaGE9MC41KSArIAogIHRoZW1lX2J3KCkgKyAKICB4bGFiKCJNYXBwaW5nIFF1YWxpdHkiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNDAsIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG91ciA9ImZvcmVzdGdyZWVuIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDU4LCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJvcmFuZ2VyZWQyIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSwgY29sb3VyID0gImJsYWNrIiksIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSkKYGBgCgoKIyMgTWFwcGluZyBRdWFsaXR5IFJhbmsgU3VtIFRlc3QKClRoaXMgaXMgdGhlIHUtYmFzZWQgei1hcHByb3hpbWF0aW9uIGZyb20gdGhlIFJhbmsgU3VtIFRlc3QgZm9yIG1hcHBpbmcgcXVhbGl0aWVzLiBJdCBjb21wYXJlcyB0aGUgbWFwcGluZyBxdWFsaXRpZXMgb2YgdGhlIHJlYWRzIHN1cHBvcnRpbmcgdGhlIHJlZmVyZW5jZSBhbGxlbGUgYW5kIHRoZSBhbHRlcm5hdGUgYWxsZWxlLiBBIHBvc2l0aXZlIHZhbHVlIG1lYW5zIHRoZSBtYXBwaW5nIHF1YWxpdGllcyBvZiB0aGUgcmVhZHMgc3VwcG9ydGluZyB0aGUgYWx0ZXJuYXRlIGFsbGVsZSBhcmUgaGlnaGVyIHRoYW4gdGhvc2Ugc3VwcG9ydGluZyB0aGUgcmVmZXJlbmNlIGFsbGVsZTsgYSBuZWdhdGl2ZSB2YWx1ZSBpbmRpY2F0ZXMgdGhlIG1hcHBpbmcgcXVhbGl0aWVzIG9mIHRoZSByZWZlcmVuY2UgYWxsZWxlIGFyZSBoaWdoZXIgdGhhbiB0aG9zZSBzdXBwb3J0aW5nIHRoZSBhbHRlcm5hdGUgYWxsZWxlLiBBIHZhbHVlIGNsb3NlIHRvIHplcm8gaXMgYmVzdCBhbmQgaW5kaWNhdGVzIGxpdHRsZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG1hcHBpbmcgcXVhbGl0aWVzLgoKIyMjIFNOUAoKYGBge3IgTVFSU1RfU05QLCBjb21tZW50PU5BLCBlY2hvPUZBTFNFfQpnZ3Bsb3QoTVFSU1RfU05QLCBhZXMoVjUpKSArIAogIGdlb21fZGVuc2l0eShjb2xvdXI9InJveWFsYmx1ZTIiLCBmaWxsPSJyb3lhbGJsdWUyIiwgYWxwaGE9MC41KSArIAogIHRoZW1lX2J3KCkgKyAKICB4bGFiKCJNYXBwaW5nIFF1YWxpdHkgUmFuayBTdW0gVGVzdCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKC0xMi41LCAxMi41KSwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0iZm9yZXN0Z3JlZW4iKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygtMi41LDIuNSksIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG91ciA9Im9yYW5nZXJlZDIiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1LCBjb2xvdXIgPSAiYmxhY2siKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpKQpgYGAKCgojIyMgSU5ERUwKCmBgYHtyIE1RUlNUX0lOREVMLCBjb21tZW50PU5BLCBlY2hvPUZBTFNFfQpnZ3Bsb3QoTVFSU1RfSU5ERUwsIGFlcyhWNSkpICsgCiAgZ2VvbV9kZW5zaXR5KGNvbG91cj0icm95YWxibHVlMiIsIGZpbGw9InJveWFsYmx1ZTIiLCBhbHBoYT0wLjUpICsgCiAgdGhlbWVfYncoKSArIAogIHhsYWIoIk1hcHBpbmcgUXVhbGl0eSBSYW5rIFN1bSBUZXN0IikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGMoLTEyLjUsIDEyLjUpLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJmb3Jlc3RncmVlbiIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKC0yLjUsMi41KSwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0ib3JhbmdlcmVkMiIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGNvbG91ciA9ICJibGFjayIpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkpCmBgYAoKCgojIyBRdWFsaXR5IGJ5IERlcHRoCgpUaGlzIGlzIHRoZSB2YXJpYW50IGNvbmZpZGVuY2UgKGZyb20gdGhlIFFVQUwgZmllbGQpIGRpdmlkZWQgYnkgdGhlIHVuZmlsdGVyZWQgZGVwdGggb2Ygbm9uLWhvbS1yZWYgc2FtcGxlcy4gVGhpcyBhbm5vdGF0aW9uIGlzIGludGVuZGVkIHRvIG5vcm1hbGl6ZSB0aGUgdmFyaWFudCBxdWFsaXR5IGluIG9yZGVyIHRvIGF2b2lkIGluZmxhdGlvbiBjYXVzZWQgd2hlbiB0aGVyZSBpcyBkZWVwIGNvdmVyYWdlLiBGb3IgZmlsdGVyaW5nIHB1cnBvc2VzIGl0IGlzIGJldHRlciB0byB1c2UgUUQgdGhhbiBlaXRoZXIgUVVBTCBvciBEUCBkaXJlY3RseS4KCiMjIyBTTlAKCmBgYHtyIFFEX1NOUCwgY29tbWVudD1OQSwgZWNobz1GQUxTRX0KZ2dwbG90KFFEX1NOUCwgYWVzKFY1KSkgKyAKICBnZW9tX2RlbnNpdHkoY29sb3VyPSJyb3lhbGJsdWUyIiwgZmlsbD0icm95YWxibHVlMiIsIGFscGhhPTAuNSkgKyAKICB0aGVtZV9idygpICsgCiAgeGxhYigiUXVhbGl0eSBCeSBEZXB0aCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKDIpLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJmb3Jlc3RncmVlbiIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKDIwKSwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0ib3JhbmdlcmVkMiIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGNvbG91ciA9ICJibGFjayIpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkpCmBgYAoKCiMjIyBJTkRFTAoKYGBge3IgUURfSU5ERUwsIGNvbW1lbnQ9TkEsIGVjaG89RkFMU0V9CmdncGxvdChRRF9JTkRFTCwgYWVzKFY1KSkgKyAKICBnZW9tX2RlbnNpdHkoY29sb3VyPSJyb3lhbGJsdWUyIiwgZmlsbD0icm95YWxibHVlMiIsIGFscGhhPTAuNSkgKyAKICB0aGVtZV9idygpICsgCiAgeGxhYigiUXVhbGl0eSBCeSBEZXB0aCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKDIpLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJmb3Jlc3RncmVlbiIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKDIwKSwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0ib3JhbmdlcmVkMiIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGNvbG91ciA9ICJibGFjayIpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkpCmBgYAoKCiMjIFN0cmFuZCBPZGRzIFJhdGlvCgpUaGlzIGlzIGFub3RoZXIgd2F5IHRvIGVzdGltYXRlIHN0cmFuZCBiaWFzIHVzaW5nIGEgdGVzdCBzaW1pbGFyIHRvIHRoZSBzeW1tZXRyaWMgb2RkcyByYXRpbyB0ZXN0LiBTT1Igd2FzIGNyZWF0ZWQgYmVjYXVzZSBGUyB0ZW5kcyB0byBwZW5hbGl6ZSB2YXJpYW50cyB0aGF0IG9jY3VyIGF0IHRoZSBlbmRzIG9mIGV4b25zLiBSZWFkcyBhdCB0aGUgZW5kcyBvZiBleG9ucyB0ZW5kIHRvIG9ubHkgYmUgY292ZXJlZCBieSByZWFkcyBpbiBvbmUgZGlyZWN0aW9uIGFuZCBGUyBnaXZlcyB0aG9zZSB2YXJpYW50cyBhIGJhZCBzY29yZS4gU09SIHdpbGwgdGFrZSBpbnRvIGFjY291bnQgdGhlIHJhdGlvcyBvZiByZWFkcyB0aGF0IGNvdmVyIGJvdGggYWxsZWxlcy4KCiMjIyBTTlAKCmBgYHtyIFNPUl9TTlAsIGNvbW1lbnQ9TkEsIGVjaG89RkFMU0V9CmdncGxvdChTT1JfU05QLCBhZXMoVjUpKSArIAogIGdlb21fZGVuc2l0eShjb2xvdXI9InJveWFsYmx1ZTIiLCBmaWxsPSJyb3lhbGJsdWUyIiwgYWxwaGE9MC41KSArIAogIHRoZW1lX2J3KCkgKyAKICB4bGFiKCJTdHJhbmQgT2RkcyBSYXRpbyIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKDMpLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJmb3Jlc3RncmVlbiIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKDEuNSksIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG91ciA9Im9yYW5nZXJlZDIiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1LCBjb2xvdXIgPSAiYmxhY2siKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpKQpgYGAKCgojIyMgSU5ERUwKCmBgYHtyIFNPUl9JTkRFTCwgY29tbWVudD1OQSwgZWNobz1GQUxTRX0KZ2dwbG90KFNPUl9JTkRFTCwgYWVzKFY1KSkgKyAKICBnZW9tX2RlbnNpdHkoY29sb3VyPSJyb3lhbGJsdWUyIiwgZmlsbD0icm95YWxibHVlMiIsIGFscGhhPTAuNSkgKyAKICB0aGVtZV9idygpICsgCiAgeGxhYigiU3RyYW5kIE9kZHMgUmF0aW8iKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygzKSwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0iZm9yZXN0Z3JlZW4iKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygxLjUpLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJvcmFuZ2VyZWQyIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSwgY29sb3VyID0gImJsYWNrIiksIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSkKYGBgCgojIyBGaXNoZXJUZXN0IFN0cmFuZAoKVGhpcyBpcyB0aGUgUGhyZWQtc2NhbGVkIHByb2JhYmlsaXR5IHRoYXQgdGhlcmUgaXMgc3RyYW5kIGJpYXMgYXQgdGhlIHNpdGUuIFN0cmFuZCBCaWFzIHRlbGxzIHVzIHdoZXRoZXIgdGhlIGFsdGVybmF0ZSBhbGxlbGUgd2FzIHNlZW4gbW9yZSBvciBsZXNzIG9mdGVuIG9uIHRoZSBmb3J3YXJkIG9yIHJldmVyc2Ugc3RyYW5kIHRoYW4gdGhlIHJlZmVyZW5jZSBhbGxlbGUuIFdoZW4gdGhlcmUgbGl0dGxlIHRvIG5vIHN0cmFuZCBiaWFzIGF0IHRoZSBzaXRlLCB0aGUgRlMgdmFsdWUgd2lsbCBiZSBjbG9zZSB0byAwLgoKIyMjIFNOUAoKYGBge3IgRlNfU05QLCBjb21tZW50PU5BLCBlY2hvPUZBTFNFfQpnZ3Bsb3QoRlNfU05QLCBhZXMoVjUpKSArIAogIGdlb21fZGVuc2l0eShjb2xvdXI9InJveWFsYmx1ZTIiLCBmaWxsPSJyb3lhbGJsdWUyIiwgYWxwaGE9MC41KSArCiAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zPSdsb2cxMCcpICsKICB0aGVtZV9idygpICsgCiAgeGxhYigiRmlzaGVyVGVzdCBTdHJhbmQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYyg2MCksIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG91ciA9ImZvcmVzdGdyZWVuIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGMoMTApLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJvcmFuZ2VyZWQyIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSwgY29sb3VyID0gImJsYWNrIiksIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSkKYGBgCgoKIyMjIElOREVMCgpgYGB7ciBGU19JTkRFTCwgY29tbWVudD1OQSwgZWNobz1GQUxTRX0KZ2dwbG90KEZTX0lOREVMLCBhZXMoVjUpKSArIAogIGdlb21fZGVuc2l0eShjb2xvdXI9InJveWFsYmx1ZTIiLCBmaWxsPSJyb3lhbGJsdWUyIiwgYWxwaGE9MC41KSArIAogIHNjYWxlX3hfY29udGludW91cyh0cmFucz0nbG9nMTAnKSArCiAgdGhlbWVfYncoKSArIAogIHhsYWIoIkZpc2hlclRlc3QgU3RyYW5kIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGMoNjApLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJmb3Jlc3RncmVlbiIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKDEwKSwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0ib3JhbmdlcmVkMiIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGNvbG91ciA9ICJibGFjayIpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkpCmBgYAoKCiMjIFJlYWQgUG9zaXRpb24gUmFuayBTdW0gVGVzdAoKVGhpcyBpcyB0aGUgdS1iYXNlZCB6LWFwcHJveGltYXRpb24gZnJvbSB0aGUgUmFuayBTdW0gVGVzdCBmb3Igc2l0ZSBwb3NpdGlvbiB3aXRoaW4gcmVhZHMuIEl0IGNvbXBhcmVzIHdoZXRoZXIgdGhlIHBvc2l0aW9ucyBvZiB0aGUgcmVmZXJlbmNlIGFuZCBhbHRlcm5hdGUgYWxsZWxlcyBhcmUgZGlmZmVyZW50IHdpdGhpbiB0aGUgcmVhZHMuIFNlZWluZyBhbiBhbGxlbGUgb25seSBuZWFyIHRoZSBlbmRzIG9mIHJlYWRzIGlzIGluZGljYXRpdmUgb2YgZXJyb3IsIGJlY2F1c2UgdGhhdCBpcyB3aGVyZSBzZXF1ZW5jZXJzIHRlbmQgdG8gbWFrZSB0aGUgbW9zdCBlcnJvcnMuIEEgbmVnYXRpdmUgdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhlIGFsdGVybmF0ZSBhbGxlbGUgaXMgZm91bmQgYXQgdGhlIGVuZHMgb2YgcmVhZHMgbW9yZSBvZnRlbiB0aGFuIHRoZSByZWZlcmVuY2UgYWxsZWxlOyBhIHBvc2l0aXZlIHZhbHVlIGluZGljYXRlcyB0aGF0IHRoZSByZWZlcmVuY2UgYWxsZWxlIGlzIGZvdW5kIGF0IHRoZSBlbmRzIG9mIHJlYWRzIG1vcmUgb2Z0ZW4gdGhhbiB0aGUgYWx0ZXJuYXRlIGFsbGVsZS4gQSB2YWx1ZSBjbG9zZSB0byB6ZXJvIGlzIGJlc3QgYmVjYXVzZSBpdCBpbmRpY2F0ZXMgdGhlcmUgaXMgbGl0dGxlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcG9zaXRpb25zIG9mIHRoZSByZWZlcmVuY2UgYW5kIGFsdGVybmF0ZSBhbGxlbGVzIGluIHRoZSByZWFkcy4KCiMjIyBTTlAKCmBgYHtyIFJTVF9TTlAsIGNvbW1lbnQ9TkEsIGVjaG89RkFMU0V9CmdncGxvdChSU1RfU05QLCBhZXMoVjUpKSArIAogIGdlb21fZGVuc2l0eShjb2xvdXI9InJveWFsYmx1ZTIiLCBmaWxsPSJyb3lhbGJsdWUyIiwgYWxwaGE9MC41KSArIAogIHRoZW1lX2J3KCkgKyAKICB4bGFiKCJSZWFkIFBvc2l0aW9uIFJhbmsgU3VtIFRlc3QiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygtOCw4KSwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0iZm9yZXN0Z3JlZW4iKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygtNCw0KSwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0ib3JhbmdlcmVkMiIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGNvbG91ciA9ICJibGFjayIpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkpCmBgYAoKCiMjIyBJTkRFTAoKYGBge3IgUlNUX0lOREVMLCBjb21tZW50PU5BLCBlY2hvPUZBTFNFfQpnZ3Bsb3QoUlNUX0lOREVMLCBhZXMoVjUpKSArIAogIGdlb21fZGVuc2l0eShjb2xvdXI9InJveWFsYmx1ZTIiLCBmaWxsPSJyb3lhbGJsdWUyIiwgYWxwaGE9MC41KSArIAogIHRoZW1lX2J3KCkgKyAKICB4bGFiKCJSZWFkIFBvc2l0aW9uIFJhbmsgU3VtIFRlc3QiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygtOCw4KSwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0iZm9yZXN0Z3JlZW4iKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygtNCw0KSwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0ib3JhbmdlcmVkMiIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGNvbG91ciA9ICJibGFjayIpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkpCmBgYAoKCiMgUG9zdCBmaWx0ZXJpbmcgY29tcGFyaXNvbnMKCgpgYGB7ciBpbnB1dF9sZW5pZW50LCBjb21tZW50PU5BLCBlY2hvPUZBTFNFfQpkYXRhX2ZvbGRlciA8LSAiL2cvZnVybG9uZy9wcm9qZWN0LzcxX0YxX3BhcmVudGFsX2dlbm90eXBpbmcvYW5hbHlzaXMvR0FUS192YXJpYW50X2NhbGwvcXVhbGl0eV9maWx0ZXJzLyIKCk1RX1NOUF9sZW5pZW50IDwtIHJlYWQudGFibGUocGFzdGUwKGRhdGFfZm9sZGVyLCAiTWFwcGluZ19RdWFsaXR5X01RX1NOUF9GMV9sZW5pZW50X2ZpbHRlcmluZy50eHQiKSkKTVFfSU5ERUxfbGVuaWVudCA8LSByZWFkLnRhYmxlKHBhc3RlMChkYXRhX2ZvbGRlciwgIk1hcHBpbmdfUXVhbGl0eV9NUV9JTkRFTF9GMV9sZW5pZW50X2ZpbHRlcmluZy50eHQiKSkKCk1RUlNUX1NOUF9sZW5pZW50IDwtIHJlYWQudGFibGUocGFzdGUwKGRhdGFfZm9sZGVyLCAiTWFwcGluZ19RdWFsaXR5X1JhbmtfU3VtX1NOUF9GMV9sZW5pZW50X2ZpbHRlcmluZy50eHQiKSkKTVFSU1RfSU5ERUxfbGVuaWVudCA8LSByZWFkLnRhYmxlKHBhc3RlMChkYXRhX2ZvbGRlciwgIk1hcHBpbmdfUXVhbGl0eV9SYW5rX1N1bV9JTkRFTF9GMV9sZW5pZW50X2ZpbHRlcmluZy50eHQiKSkKClFEX1NOUF9sZW5pZW50IDwtIHJlYWQudGFibGUocGFzdGUwKGRhdGFfZm9sZGVyLCAiUXVhbGl0eV9CeV9EZXB0aF9RRF9TTlBfRjFfbGVuaWVudF9maWx0ZXJpbmcudHh0IikpClFEX0lOREVMX2xlbmllbnQgPC0gcmVhZC50YWJsZShwYXN0ZTAoZGF0YV9mb2xkZXIsICJRdWFsaXR5X0J5X0RlcHRoX1FEX0lOREVMX0YxX2xlbmllbnRfZmlsdGVyaW5nLnR4dCIpKQoKU09SX1NOUF9sZW5pZW50IDwtIHJlYWQudGFibGUocGFzdGUwKGRhdGFfZm9sZGVyLCAiU3RyYW5kX09kZHNfUmF0aW9fU09SX1NOUF9GMV9sZW5pZW50X2ZpbHRlcmluZy50eHQiKSkKU09SX0lOREVMX2xlbmllbnQgPC0gcmVhZC50YWJsZShwYXN0ZTAoZGF0YV9mb2xkZXIsICJTdHJhbmRfT2Rkc19SYXRpb19TT1JfSU5ERUxfRjFfbGVuaWVudF9maWx0ZXJpbmcudHh0IikpCgpGU19TTlBfbGVuaWVudCA8LSByZWFkLnRhYmxlKHBhc3RlMChkYXRhX2ZvbGRlciwgIkZpc2hlcl9TdHJhbmRfRlNfU05QX0YxX2xlbmllbnRfZmlsdGVyaW5nLnR4dCIpKQpGU19JTkRFTF9sZW5pZW50IDwtIHJlYWQudGFibGUocGFzdGUwKGRhdGFfZm9sZGVyLCAiRmlzaGVyX1N0cmFuZF9GU19JTkRFTF9GMV9sZW5pZW50X2ZpbHRlcmluZy50eHQiKSkKClJTVF9TTlBfbGVuaWVudCA8LSByZWFkLnRhYmxlKHBhc3RlMChkYXRhX2ZvbGRlciwgIlJhbmtfU3VtX1Rlc3RfU05QX0YxX2xlbmllbnRfZmlsdGVyaW5nLnR4dCIpKQpSU1RfSU5ERUxfbGVuaWVudCA8LSByZWFkLnRhYmxlKHBhc3RlMChkYXRhX2ZvbGRlciwgIlJhbmtfU3VtX1Rlc3RfSU5ERUxfRjFfbGVuaWVudF9maWx0ZXJpbmcudHh0IikpCmBgYAoKYGBge3IgaW5wdXRfc3RyaW5nZW50LCBjb21tZW50PU5BLCBlY2hvPUZBTFNFfQpkYXRhX2ZvbGRlciA8LSAiL2cvZnVybG9uZy9wcm9qZWN0LzcxX0YxX3BhcmVudGFsX2dlbm90eXBpbmcvYW5hbHlzaXMvR0FUS192YXJpYW50X2NhbGwvcXVhbGl0eV9maWx0ZXJzLyIKCk1RX1NOUF9zdHJpbmdlbnQgPC0gcmVhZC50YWJsZShwYXN0ZTAoZGF0YV9mb2xkZXIsICJNYXBwaW5nX1F1YWxpdHlfTVFfU05QX0YxX3N0cmluZ2VudF9maWx0ZXJpbmcudHh0IikpCk1RX0lOREVMX3N0cmluZ2VudCA8LSByZWFkLnRhYmxlKHBhc3RlMChkYXRhX2ZvbGRlciwgIk1hcHBpbmdfUXVhbGl0eV9NUV9JTkRFTF9GMV9zdHJpbmdlbnRfZmlsdGVyaW5nLnR4dCIpKQoKTVFSU1RfU05QX3N0cmluZ2VudCA8LSByZWFkLnRhYmxlKHBhc3RlMChkYXRhX2ZvbGRlciwgIk1hcHBpbmdfUXVhbGl0eV9SYW5rX1N1bV9TTlBfRjFfc3RyaW5nZW50X2ZpbHRlcmluZy50eHQiKSkKTVFSU1RfSU5ERUxfc3RyaW5nZW50IDwtIHJlYWQudGFibGUocGFzdGUwKGRhdGFfZm9sZGVyLCAiTWFwcGluZ19RdWFsaXR5X1JhbmtfU3VtX0lOREVMX0YxX3N0cmluZ2VudF9maWx0ZXJpbmcudHh0IikpCgpRRF9TTlBfc3RyaW5nZW50IDwtIHJlYWQudGFibGUocGFzdGUwKGRhdGFfZm9sZGVyLCAiUXVhbGl0eV9CeV9EZXB0aF9RRF9TTlBfRjFfc3RyaW5nZW50X2ZpbHRlcmluZy50eHQiKSkKUURfSU5ERUxfc3RyaW5nZW50IDwtIHJlYWQudGFibGUocGFzdGUwKGRhdGFfZm9sZGVyLCAiUXVhbGl0eV9CeV9EZXB0aF9RRF9JTkRFTF9GMV9zdHJpbmdlbnRfZmlsdGVyaW5nLnR4dCIpKQoKU09SX1NOUF9zdHJpbmdlbnQgPC0gcmVhZC50YWJsZShwYXN0ZTAoZGF0YV9mb2xkZXIsICJTdHJhbmRfT2Rkc19SYXRpb19TT1JfU05QX0YxX3N0cmluZ2VudF9maWx0ZXJpbmcudHh0IikpClNPUl9JTkRFTF9zdHJpbmdlbnQgPC0gcmVhZC50YWJsZShwYXN0ZTAoZGF0YV9mb2xkZXIsICJTdHJhbmRfT2Rkc19SYXRpb19TT1JfSU5ERUxfRjFfc3RyaW5nZW50X2ZpbHRlcmluZy50eHQiKSkKCkZTX1NOUF9zdHJpbmdlbnQgPC0gcmVhZC50YWJsZShwYXN0ZTAoZGF0YV9mb2xkZXIsICJGaXNoZXJfU3RyYW5kX0ZTX1NOUF9GMV9zdHJpbmdlbnRfZmlsdGVyaW5nLnR4dCIpKQpGU19JTkRFTF9zdHJpbmdlbnQgPC0gcmVhZC50YWJsZShwYXN0ZTAoZGF0YV9mb2xkZXIsICJGaXNoZXJfU3RyYW5kX0ZTX0lOREVMX0YxX3N0cmluZ2VudF9maWx0ZXJpbmcudHh0IikpCgpSU1RfU05QX3N0cmluZ2VudCA8LSByZWFkLnRhYmxlKHBhc3RlMChkYXRhX2ZvbGRlciwgIlJhbmtfU3VtX1Rlc3RfU05QX0YxX3N0cmluZ2VudF9maWx0ZXJpbmcudHh0IikpClJTVF9JTkRFTF9zdHJpbmdlbnQgPC0gcmVhZC50YWJsZShwYXN0ZTAoZGF0YV9mb2xkZXIsICJSYW5rX1N1bV9UZXN0X0lOREVMX0YxX3N0cmluZ2VudF9maWx0ZXJpbmcudHh0IikpCmBgYAoKCgojIyBNYXBwaW5nIFF1YWxpdHkKCmBgYHtyIE1RX1NOUF9maWx0ZXJpbmdfc3RhdHMsIGNvbW1lbnQ9TkEsIGVjaG89RkFMU0V9Ck1RX1NOUF9sZW5pZW50X2ZpbHRlcmVkIDwtIHN1YnNldChNUV9TTlAsIFY1ID4gNDApCk1RX1NOUF9zdHJpbmdlbnRfZmlsdGVyZWQgPC0gc3Vic2V0KE1RX1NOUCwgVjUgPiA1OCkKYGBgCgoKCiMjIyBTTlAKClRoZSB0b3RhbCBudW1iZXIgb2YgdmFyaWFudHMgZmlsdGVyZWQgYnkgTVEgZm9yIFNOUDogCgogICogbGVuaWVudDogYHIgbnJvdyhNUV9TTlApIC0gbnJvdyhNUV9TTlBfbGVuaWVudF9maWx0ZXJlZClgIHRoYXQgY29ycmVzcG9uZCB0bzogYHIgKG5yb3coTVFfU05QKSAtIG5yb3coTVFfU05QX2xlbmllbnRfZmlsdGVyZWQpKSAvIG5yb3coTVFfU05QKSoxMDBgJQogIAogICogc3RyaW5nZW50OiBgciBucm93KE1RX1NOUCkgLSBucm93KE1RX1NOUF9zdHJpbmdlbnRfZmlsdGVyZWQpYCB0aGF0IGNvcnJlc3BvbmQgdG86IGByIChucm93KE1RX1NOUCkgLSBucm93KE1RX1NOUF9zdHJpbmdlbnRfZmlsdGVyZWQpKSAvIG5yb3coTVFfU05QKSoxMDBgJQogIAogIApgYGB7ciBNUV9JTkRFTF9maWx0ZXJpbmdfc3RhdHMsIGNvbW1lbnQ9TkEsIGVjaG89RkFMU0V9Ck1RX0lOREVMX2xlbmllbnRfZmlsdGVyZWQgPC0gc3Vic2V0KE1RX0lOREVMLCBWNSA+IDQwKQpNUV9JTkRFTF9zdHJpbmdlbnRfZmlsdGVyZWQgPC0gc3Vic2V0KE1RX0lOREVMLCBWNSA+IDU4KQpgYGAKCmBgYHtyIE1RX1NOUF9hbGwsIGNvbW1lbnQ9TkEsIGVjaG89RkFMU0V9Ck1RX1NOUCR0eXBlIDwtICJyYXciCk1RX1NOUF9sZW5pZW50JHR5cGUgPC0gImxlbmllbnQiCk1RX1NOUF9zdHJpbmdlbnQkdHlwZSA8LSAic3RyaW5nZW50IgpNUV9TTlBfYWxsIDwtIHJiaW5kKE1RX1NOUCwgTVFfU05QX2xlbmllbnQsIE1RX1NOUF9zdHJpbmdlbnQpCgpnZ3Bsb3QoTVFfU05QX2FsbCwgYWVzKFY1LCBmaWxsPXR5cGUsIGNvbG91cj10eXBlKSkgKyAKICAgZ2VvbV9kZW5zaXR5KGFscGhhPTAuMikgKyAKICAgdGhlbWVfYncoKSArIAogICB4bGFiKCJNYXBwaW5nIHF1YWxpdHkiKSArCiAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDQwLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJmb3Jlc3RncmVlbiIpICsKICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNTgsIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG91ciA9Im9yYW5nZXJlZDIiKSArCiAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImZvcmVzdGdyZWVuIiwgInJveWFsYmx1ZTIiLCAib3JhbmdlcmVkMiIpKSArCiAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiZm9yZXN0Z3JlZW4iLCAicm95YWxibHVlMiIsICJvcmFuZ2VyZWQyIikpICsKICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1LCBjb2xvdXIgPSAiYmxhY2siKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpKQpgYGAKCgojIyMgSU5ERUwKClRoZSB0b3RhbCBudW1iZXIgb2YgdmFyaWFudHMgZmlsdGVyZWQgYnkgTVEgZm9yIElOREVMOiAKCiAgKiBsZW5pZW50OiBgciBucm93KE1RX0lOREVMKSAtIG5yb3coTVFfSU5ERUxfbGVuaWVudF9maWx0ZXJlZClgIHRoYXQgY29ycmVzcG9uZCB0bzogYHIgKG5yb3coTVFfSU5ERUwpIC0gbnJvdyhNUV9JTkRFTF9sZW5pZW50X2ZpbHRlcmVkKSkgLyBucm93KE1RX0lOREVMKSAqIDEwMGAlCiAgCiAgKiBzdHJpbmdlbnQ6IGByIG5yb3coTVFfSU5ERUwpIC0gbnJvdyhNUV9JTkRFTF9zdHJpbmdlbnRfZmlsdGVyZWQpYCB0aGF0IGNvcnJlc3BvbmQgdG86IGByIChucm93KE1RX0lOREVMKSAtIG5yb3coTVFfSU5ERUxfc3RyaW5nZW50X2ZpbHRlcmVkKSkgLyBucm93KE1RX0lOREVMKSAqIDEwMGAlCgpgYGB7ciBNUV9JTkRFTF9hbGwsIGNvbW1lbnQ9TkEsIGVjaG89RkFMU0V9Ck1RX0lOREVMJHR5cGUgPC0gInJhdyIKTVFfSU5ERUxfbGVuaWVudCR0eXBlIDwtICJsZW5pZW50IgpNUV9JTkRFTF9zdHJpbmdlbnQkdHlwZSA8LSAic3RyaW5nZW50IgpNUV9JTkRFTF9hbGwgPC0gcmJpbmQoTVFfSU5ERUwsIE1RX0lOREVMX2xlbmllbnQsIE1RX0lOREVMX3N0cmluZ2VudCkKCmdncGxvdChNUV9TTlBfYWxsLCBhZXMoVjUsIGZpbGw9dHlwZSwgY29sb3VyPXR5cGUpKSArIAogICBnZW9tX2RlbnNpdHkoYWxwaGE9MC4yKSArIAogICB0aGVtZV9idygpICsgCiAgIHhsYWIoIk1hcHBpbmcgcXVhbGl0eSIpICsKICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNDAsIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG91ciA9ImZvcmVzdGdyZWVuIikgKwogICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSA1OCwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0ib3JhbmdlcmVkMiIpICsKICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZm9yZXN0Z3JlZW4iLCAicm95YWxibHVlMiIsICJvcmFuZ2VyZWQyIikpICsKICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJmb3Jlc3RncmVlbiIsICJyb3lhbGJsdWUyIiwgIm9yYW5nZXJlZDIiKSkgKwogICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGNvbG91ciA9ICJibGFjayIpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkpCmBgYAoKIyMgTWFwcGluZyBRdWFsaXR5IFJhbmsgU3VtIFRlc3QKCmBgYHtyIE1RUlNUX1NOUF9maWx0ZXJpbmdfc3RhdHMsIGNvbW1lbnQ9TkEsIGVjaG89RkFMU0V9Ck1RUlNUX1NOUF9sZW5pZW50X2ZpbHRlcmVkIDwtIHN1YnNldChNUVJTVF9TTlAsIFY1ID4gLTEyLjUgJiBWNSA8IDEyLjUpCk1RUlNUX1NOUF9zdHJpbmdlbnRfZmlsdGVyZWQgPC0gc3Vic2V0KE1RUlNUX1NOUCwgVjUgPiAtMi41ICYgVjUgPDIuNSkKYGBgCgoKICAKYGBge3IgTVFSU1RfSU5ERUxfZmlsdGVyaW5nX3N0YXRzLCBjb21tZW50PU5BLCBlY2hvPUZBTFNFfQpNUVJTVF9JTkRFTF9sZW5pZW50X2ZpbHRlcmVkIDwtIHN1YnNldChNUVJTVF9JTkRFTCwgVjUgPiAtMTIuNSAmIFY1IDwgMTIuNSkKTVFSU1RfSU5ERUxfc3RyaW5nZW50X2ZpbHRlcmVkIDwtIHN1YnNldChNUVJTVF9JTkRFTCwgVjUgPiAtMi41ICYgVjUgPDIuNSkKYGBgCgoKIyMjIFNOUAoKVGhlIHRvdGFsIG51bWJlciBvZiB2YXJpYW50cyBmaWx0ZXJlZCBieSBNUVJTVCBmb3IgU05QOiAKCiAgKiBsZW5pZW50OiBgciBucm93KE1RUlNUX1NOUCkgLSBucm93KE1RUlNUX1NOUF9sZW5pZW50X2ZpbHRlcmVkKWAgdGhhdCBjb3JyZXNwb25kIHRvOiBgciAobnJvdyhNUVJTVF9TTlApIC0gbnJvdyhNUVJTVF9TTlBfbGVuaWVudF9maWx0ZXJlZCkpIC8gbnJvdyhNUVJTVF9TTlApICogMTAwYCUKICAKICAqIHN0cmluZ2VudDogYHIgbnJvdyhNUVJTVF9TTlApIC0gbnJvdyhNUVJTVF9TTlBfc3RyaW5nZW50X2ZpbHRlcmVkKWAgdGhhdCBjb3JyZXNwb25kIHRvOiBgciAobnJvdyhNUVJTVF9TTlApIC0gbnJvdyhNUVJTVF9TTlBfc3RyaW5nZW50X2ZpbHRlcmVkKSkgLyBucm93KE1RUlNUX1NOUCkgKiAxMDBgJQogIAoKYGBge3IgTVFSU1RfU05QX2FsbCwgY29tbWVudD1OQSwgZWNobz1GQUxTRX0KTVFSU1RfU05QJHR5cGUgPC0gInJhdyIKTVFSU1RfU05QX2xlbmllbnQkdHlwZSA8LSAibGVuaWVudCIKTVFSU1RfU05QX3N0cmluZ2VudCR0eXBlIDwtICJzdHJpbmdlbnQiCk1RUlNUX1NOUF9hbGwgPC0gcmJpbmQoTVFSU1RfU05QLCBNUVJTVF9TTlBfbGVuaWVudCwgTVFSU1RfU05QX3N0cmluZ2VudCkKCmdncGxvdChNUVJTVF9TTlBfYWxsLCBhZXMoVjUsIGZpbGw9dHlwZSwgY29sb3VyPXR5cGUpKSArIAogIGdlb21fZGVuc2l0eShhbHBoYT0wLjIpICsKICB0aGVtZV9idygpICsgCiAgeGxhYigiTWFwcGluZyBRdWFsaXR5IFJhbmsgU3VtIFRlc3QiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygtMTIuNSwgMTIuNSksIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG91ciA9ImZvcmVzdGdyZWVuIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGMoLTIuNSwyLjUpLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJvcmFuZ2VyZWQyIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImZvcmVzdGdyZWVuIiwgInJveWFsYmx1ZTIiLCAib3JhbmdlcmVkMiIpKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJmb3Jlc3RncmVlbiIsICJyb3lhbGJsdWUyIiwgIm9yYW5nZXJlZDIiKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSwgY29sb3VyID0gImJsYWNrIiksIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSkKYGBgCgoKIyMjIElOREVMCgpUaGUgdG90YWwgbnVtYmVyIG9mIHZhcmlhbnRzIGZpbHRlcmVkIGJ5IE1RUlNUIGZvciBJTkRFTDogCgogICogbGVuaWVudDogYHIgbnJvdyhNUVJTVF9JTkRFTCkgLSBucm93KE1RUlNUX0lOREVMX2xlbmllbnRfZmlsdGVyZWQpYCB0aGF0IGNvcnJlc3BvbmQgdG86IGByIChucm93KE1RUlNUX0lOREVMKSAtIG5yb3coTVFSU1RfSU5ERUxfbGVuaWVudF9maWx0ZXJlZCkpIC8gbnJvdyhNUVJTVF9JTkRFTCkgKiAxMDBgJQogIAogICogc3RyaW5nZW50OiBgciBucm93KE1RUlNUX0lOREVMKSAtIG5yb3coTVFSU1RfSU5ERUxfc3RyaW5nZW50X2ZpbHRlcmVkKWAgdGhhdCBjb3JyZXNwb25kIHRvOiBgciAobnJvdyhNUVJTVF9JTkRFTCkgLSBucm93KE1RUlNUX0lOREVMX3N0cmluZ2VudF9maWx0ZXJlZCkpIC8gbnJvdyhNUVJTVF9JTkRFTCkgKiAxMDBgJQoKCmBgYHtyIE1RUlNUX0lOREVMX2FsbCwgY29tbWVudD1OQSwgZWNobz1GQUxTRX0KTVFSU1RfSU5ERUwkdHlwZSA8LSAicmF3IgpNUVJTVF9JTkRFTF9sZW5pZW50JHR5cGUgPC0gImxlbmllbnQiCk1RUlNUX0lOREVMX3N0cmluZ2VudCR0eXBlIDwtICJzdHJpbmdlbnQiCk1RUlNUX0lOREVMX2FsbCA8LSByYmluZChNUVJTVF9JTkRFTCwgTVFSU1RfSU5ERUxfbGVuaWVudCwgTVFSU1RfSU5ERUxfc3RyaW5nZW50KQoKZ2dwbG90KE1RUlNUX0lOREVMX2FsbCwgYWVzKFY1LCBmaWxsPXR5cGUsIGNvbG91cj10eXBlKSkgKyAKICBnZW9tX2RlbnNpdHkoYWxwaGE9MC4yKSArCiAgdGhlbWVfYncoKSArIAogIHhsYWIoIk1hcHBpbmcgUXVhbGl0eSBSYW5rIFN1bSBUZXN0IikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGMoLTEyLjUsIDEyLjUpLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJmb3Jlc3RncmVlbiIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKC0yLjUsMi41KSwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0ib3JhbmdlcmVkMiIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJmb3Jlc3RncmVlbiIsICJyb3lhbGJsdWUyIiwgIm9yYW5nZXJlZDIiKSkgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiZm9yZXN0Z3JlZW4iLCAicm95YWxibHVlMiIsICJvcmFuZ2VyZWQyIikpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGNvbG91ciA9ICJibGFjayIpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkpCmBgYAoKCiMjIFF1YWxpdHkgYnkgRGVwdGgKCmBgYHtyIFFEX1NOUF9maWx0ZXJpbmdfc3RhdHMsIGNvbW1lbnQ9TkEsIGVjaG89RkFMU0V9ClFEX1NOUF9sZW5pZW50X2ZpbHRlcmVkIDwtIHN1YnNldChRRF9TTlAsIFY1ID4gMikKUURfU05QX3N0cmluZ2VudF9maWx0ZXJlZCA8LSBzdWJzZXQoUURfU05QLCBWNSA+IDIwKQpgYGAKICAKYGBge3IgUURfSU5ERUxfZmlsdGVyaW5nX3N0YXRzLCBjb21tZW50PU5BLCBlY2hvPUZBTFNFfQpRRF9JTkRFTF9sZW5pZW50X2ZpbHRlcmVkIDwtIHN1YnNldChRRF9JTkRFTCwgVjUgPiAyKQpRRF9JTkRFTF9zdHJpbmdlbnRfZmlsdGVyZWQgPC0gc3Vic2V0KFFEX0lOREVMLCBWNSA+IDIwKQpgYGAKCiMjIyBTTlAKClRoZSB0b3RhbCBudW1iZXIgb2YgdmFyaWFudHMgZmlsdGVyZWQgYnkgUUQgZm9yIFNOUDogCgogICogbGVuaWVudDogYHIgbnJvdyhRRF9TTlApIC0gbnJvdyhRRF9TTlBfbGVuaWVudF9maWx0ZXJlZClgIHRoYXQgY29ycmVzcG9uZCB0bzogYHIgKG5yb3coUURfU05QKSAtIG5yb3coUURfU05QX2xlbmllbnRfZmlsdGVyZWQpKSAvIG5yb3coUURfU05QKSAqIDEwMGAlCiAgCiAgKiBzdHJpbmdlbnQ6IGByIG5yb3coUURfU05QKSAtIG5yb3coUURfU05QX3N0cmluZ2VudF9maWx0ZXJlZClgIHRoYXQgY29ycmVzcG9uZCB0bzogYHIgKG5yb3coUURfU05QKSAtIG5yb3coUURfU05QX3N0cmluZ2VudF9maWx0ZXJlZCkpIC8gbnJvdyhRRF9TTlApICogMTAwYCUKCmBgYHtyIFFEX1NOUF9hbGwsIGNvbW1lbnQ9TkEsIGVjaG89RkFMU0V9ClFEX1NOUCR0eXBlIDwtICJyYXciClFEX1NOUF9sZW5pZW50JHR5cGUgPC0gImxlbmllbnQiClFEX1NOUF9zdHJpbmdlbnQkdHlwZSA8LSAic3RyaW5nZW50IgpRRF9TTlBfYWxsIDwtIHJiaW5kKFFEX1NOUCwgUURfU05QX2xlbmllbnQsIFFEX1NOUF9zdHJpbmdlbnQpCgpnZ3Bsb3QoUURfU05QX2FsbCwgYWVzKFY1LCBmaWxsPXR5cGUsIGNvbG91cj10eXBlKSkgKyAgCiAgZ2VvbV9kZW5zaXR5KGFscGhhPTAuMikgKwogIHRoZW1lX2J3KCkgKyAKICB4bGFiKCJRdWFsaXR5IEJ5IERlcHRoIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGMoMiksIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG91ciA9ImZvcmVzdGdyZWVuIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGMoMjApLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJvcmFuZ2VyZWQyIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImZvcmVzdGdyZWVuIiwgInJveWFsYmx1ZTIiLCAib3JhbmdlcmVkMiIpKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJmb3Jlc3RncmVlbiIsICJyb3lhbGJsdWUyIiwgIm9yYW5nZXJlZDIiKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSwgY29sb3VyID0gImJsYWNrIiksIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSkKYGBgCgoKIyMjIElOREVMCgpUaGUgdG90YWwgbnVtYmVyIG9mIHZhcmlhbnRzIGZpbHRlcmVkIGJ5IFFEIGZvciBTTlA6IAoKICAqIGxlbmllbnQ6IGByIG5yb3coUURfSU5ERUwpIC0gbnJvdyhRRF9JTkRFTF9sZW5pZW50X2ZpbHRlcmVkKWAgdGhhdCBjb3JyZXNwb25kIHRvOiBgciAobnJvdyhRRF9JTkRFTCkgLSBucm93KFFEX0lOREVMX2xlbmllbnRfZmlsdGVyZWQpKSAvIG5yb3coUURfSU5ERUwpICogMTAwYCUKICAKICAqIHN0cmluZ2VudDogYHIgbnJvdyhRRF9JTkRFTCkgLSBucm93KFFEX0lOREVMX3N0cmluZ2VudF9maWx0ZXJlZClgIHRoYXQgY29ycmVzcG9uZCB0bzogYHIgKG5yb3coUURfSU5ERUwpIC0gbnJvdyhRRF9JTkRFTF9zdHJpbmdlbnRfZmlsdGVyZWQpKSAvIG5yb3coUURfSU5ERUwpICogMTAwYCUKCmBgYHtyIFFEX0lOREVMX2FsbCwgY29tbWVudD1OQSwgZWNobz1GQUxTRX0KUURfSU5ERUwkdHlwZSA8LSAicmF3IgpRRF9JTkRFTF9sZW5pZW50JHR5cGUgPC0gImxlbmllbnQiClFEX0lOREVMX3N0cmluZ2VudCR0eXBlIDwtICJzdHJpbmdlbnQiClFEX0lOREVMX2FsbCA8LSByYmluZChRRF9JTkRFTCwgUURfSU5ERUxfbGVuaWVudCwgUURfSU5ERUxfc3RyaW5nZW50KQoKZ2dwbG90KFFEX0lOREVMX2FsbCwgYWVzKFY1LCBmaWxsPXR5cGUsIGNvbG91cj10eXBlKSkgKyAKICBnZW9tX2RlbnNpdHkoYWxwaGE9MC4yKSArCiAgdGhlbWVfYncoKSArIAogIHhsYWIoIlF1YWxpdHkgQnkgRGVwdGgiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygyKSwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0iZm9yZXN0Z3JlZW4iKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygyMCksIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG91ciA9Im9yYW5nZXJlZDIiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZm9yZXN0Z3JlZW4iLCAicm95YWxibHVlMiIsICJvcmFuZ2VyZWQyIikpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoImZvcmVzdGdyZWVuIiwgInJveWFsYmx1ZTIiLCAib3JhbmdlcmVkMiIpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1LCBjb2xvdXIgPSAiYmxhY2siKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpKQpgYGAKCgojIyBTdHJhbmQgT2RkcyBSYXRpbwoKYGBge3IgU09SX1NOUF9maWx0ZXJpbmdfc3RhdHMsIGNvbW1lbnQ9TkEsIGVjaG89RkFMU0V9ClNPUl9TTlBfbGVuaWVudF9maWx0ZXJlZCA8LSBzdWJzZXQoU09SX1NOUCwgVjUgPCAzKQpTT1JfU05QX3N0cmluZ2VudF9maWx0ZXJlZCA8LSBzdWJzZXQoU09SX1NOUCwgVjUgPCAxLjUpCmBgYAogIApgYGB7ciBTT1JfSU5ERUxfZmlsdGVyaW5nX3N0YXRzLCBjb21tZW50PU5BLCBlY2hvPUZBTFNFfQpTT1JfSU5ERUxfbGVuaWVudF9maWx0ZXJlZCA8LSBzdWJzZXQoU09SX0lOREVMLCBWNSA8IDMpClNPUl9JTkRFTF9zdHJpbmdlbnRfZmlsdGVyZWQgPC0gc3Vic2V0KFNPUl9JTkRFTCwgVjUgPCAxLjUpCmBgYAoKCiMjIyBTTlAKClRoZSB0b3RhbCBudW1iZXIgb2YgdmFyaWFudHMgZmlsdGVyZWQgYnkgU09SIGZvciBTTlA6IAoKICAqIGxlbmllbnQ6IGByIG5yb3coU09SX1NOUCkgLSBucm93KFNPUl9TTlBfbGVuaWVudF9maWx0ZXJlZClgIHRoYXQgY29ycmVzcG9uZCB0bzogYHIgKG5yb3coU09SX1NOUCkgLSBucm93KFNPUl9TTlBfbGVuaWVudF9maWx0ZXJlZCkpIC8gbnJvdyhTT1JfU05QKSAqIDEwMGAlCiAgCiAgKiBzdHJpbmdlbnQ6IGByIG5yb3coU09SX1NOUCkgLSBucm93KFNPUl9TTlBfc3RyaW5nZW50X2ZpbHRlcmVkKWAgdGhhdCBjb3JyZXNwb25kIHRvOiBgciAobnJvdyhTT1JfU05QKSAtIG5yb3coU09SX1NOUF9zdHJpbmdlbnRfZmlsdGVyZWQpKSAvIG5yb3coU09SX1NOUCkgKiAxMDBgJQoKCmBgYHtyIFNPUl9TTlBfYWxsLCBjb21tZW50PU5BLCBlY2hvPUZBTFNFfQpTT1JfU05QJHR5cGUgPC0gInJhdyIKU09SX1NOUF9sZW5pZW50JHR5cGUgPC0gImxlbmllbnQiClNPUl9TTlBfc3RyaW5nZW50JHR5cGUgPC0gInN0cmluZ2VudCIKU09SX1NOUF9hbGwgPC0gcmJpbmQoU09SX1NOUCwgU09SX1NOUF9sZW5pZW50LCBTT1JfU05QX3N0cmluZ2VudCkKCmdncGxvdChTT1JfU05QX2FsbCwgYWVzKFY1LCBmaWxsPXR5cGUsIGNvbG91cj10eXBlKSkgKyAKICBnZW9tX2RlbnNpdHkoYWxwaGE9MC4yKSArCiAgdGhlbWVfYncoKSArIAogIHhsYWIoIlN0cmFuZCBPZGRzIFJhdGlvIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGMoMyksIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG91ciA9ImZvcmVzdGdyZWVuIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGMoMS41KSwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0ib3JhbmdlcmVkMiIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJmb3Jlc3RncmVlbiIsICJyb3lhbGJsdWUyIiwgIm9yYW5nZXJlZDIiKSkgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiZm9yZXN0Z3JlZW4iLCAicm95YWxibHVlMiIsICJvcmFuZ2VyZWQyIikpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGNvbG91ciA9ICJibGFjayIpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkpCmBgYAoKCiMjIyBJTkRFTAoKVGhlIHRvdGFsIG51bWJlciBvZiB2YXJpYW50cyBmaWx0ZXJlZCBieSBTT1IgZm9yIElOREVMOiAKCiAgKiBsZW5pZW50OiBgciBucm93KFNPUl9JTkRFTCkgLSBucm93KFNPUl9JTkRFTF9sZW5pZW50X2ZpbHRlcmVkKWAgdGhhdCBjb3JyZXNwb25kIHRvOiBgciAobnJvdyhTT1JfSU5ERUwpIC0gbnJvdyhTT1JfSU5ERUxfbGVuaWVudF9maWx0ZXJlZCkpIC8gbnJvdyhTT1JfSU5ERUwpICogMTAwYCUKICAKICAqIHN0cmluZ2VudDogYHIgbnJvdyhTT1JfSU5ERUwpIC0gbnJvdyhTT1JfSU5ERUxfc3RyaW5nZW50X2ZpbHRlcmVkKWAgdGhhdCBjb3JyZXNwb25kIHRvOiBgciAobnJvdyhTT1JfSU5ERUwpIC0gbnJvdyhTT1JfSU5ERUxfc3RyaW5nZW50X2ZpbHRlcmVkKSkgLyBucm93KFNPUl9JTkRFTCkgKiAxMDBgJQoKYGBge3IgU09SX0lOREVMX2FsbCwgY29tbWVudD1OQSwgZWNobz1GQUxTRX0KU09SX0lOREVMJHR5cGUgPC0gInJhdyIKU09SX0lOREVMX2xlbmllbnQkdHlwZSA8LSAibGVuaWVudCIKU09SX0lOREVMX3N0cmluZ2VudCR0eXBlIDwtICJzdHJpbmdlbnQiClNPUl9JTkRFTF9hbGwgPC0gcmJpbmQoU09SX0lOREVMLCBTT1JfSU5ERUxfbGVuaWVudCwgU09SX0lOREVMX3N0cmluZ2VudCkKCmdncGxvdChTT1JfSU5ERUxfYWxsLCBhZXMoVjUsIGZpbGw9dHlwZSwgY29sb3VyPXR5cGUpKSArIAogIGdlb21fZGVuc2l0eShhbHBoYT0wLjIpICsKICB0aGVtZV9idygpICsgCiAgeGxhYigiU3RyYW5kIE9kZHMgUmF0aW8iKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygzKSwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0iZm9yZXN0Z3JlZW4iKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygxLjUpLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJvcmFuZ2VyZWQyIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImZvcmVzdGdyZWVuIiwgInJveWFsYmx1ZTIiLCAib3JhbmdlcmVkMiIpKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJmb3Jlc3RncmVlbiIsICJyb3lhbGJsdWUyIiwgIm9yYW5nZXJlZDIiKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSwgY29sb3VyID0gImJsYWNrIiksIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSkKYGBgCgoKIyMgRmlzaGVyVGVzdCBTdHJhbmQKCmBgYHtyIEZTX1NOUF9maWx0ZXJpbmdfc3RhdHMsIGNvbW1lbnQ9TkEsIGVjaG89RkFMU0V9CkZTX1NOUF9sZW5pZW50X2ZpbHRlcmVkIDwtIHN1YnNldChGU19TTlAsIFY1IDwgNjApCkZTX1NOUF9zdHJpbmdlbnRfZmlsdGVyZWQgPC0gc3Vic2V0KEZTX1NOUCwgVjUgPCAxMCkKYGBgCiAgCmBgYHtyIEZTX0lOREVMX2ZpbHRlcmluZ19zdGF0cywgY29tbWVudD1OQSwgZWNobz1GQUxTRX0KRlNfSU5ERUxfbGVuaWVudF9maWx0ZXJlZCA8LSBzdWJzZXQoRlNfSU5ERUwsIFY1IDwgNjApCkZTX0lOREVMX3N0cmluZ2VudF9maWx0ZXJlZCA8LSBzdWJzZXQoRlNfSU5ERUwsIFY1IDwgMTApCmBgYAoKIyMjIFNOUAoKVGhlIHRvdGFsIG51bWJlciBvZiB2YXJpYW50cyBmaWx0ZXJlZCBieSBGUyBmb3IgU05QOiAKCiAgKiBsZW5pZW50OiBgciBucm93KEZTX1NOUCkgLSBucm93KEZTX1NOUF9sZW5pZW50X2ZpbHRlcmVkKWAgdGhhdCBjb3JyZXNwb25kIHRvOiBgciAobnJvdyhGU19TTlApIC0gbnJvdyhGU19TTlBfbGVuaWVudF9maWx0ZXJlZCkpIC8gbnJvdyhGU19TTlApICogMTAwYCUKICAKICAqIHN0cmluZ2VudDogYHIgbnJvdyhGU19TTlApIC0gbnJvdyhGU19TTlBfc3RyaW5nZW50X2ZpbHRlcmVkKWAgdGhhdCBjb3JyZXNwb25kIHRvOiBgciAobnJvdyhGU19TTlApIC0gbnJvdyhGU19TTlBfc3RyaW5nZW50X2ZpbHRlcmVkKSkgLyBucm93KEZTX1NOUCkgKiAxMDBgJQoKYGBge3IgRlNfU05QX2FsbCwgY29tbWVudD1OQSwgZWNobz1GQUxTRX0KRlNfU05QJHR5cGUgPC0gInJhdyIKRlNfU05QX2xlbmllbnQkdHlwZSA8LSAibGVuaWVudCIKRlNfU05QX3N0cmluZ2VudCR0eXBlIDwtICJzdHJpbmdlbnQiCkZTX1NOUF9hbGwgPC0gcmJpbmQoRlNfU05QLCBGU19TTlBfbGVuaWVudCwgRlNfU05QX3N0cmluZ2VudCkKCmdncGxvdChGU19TTlBfYWxsLCBhZXMoVjUsIGZpbGw9dHlwZSwgY29sb3VyPXR5cGUpKSArIAogIGdlb21fZGVuc2l0eShhbHBoYT0wLjIpICsKICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnM9J2xvZzEwJykgKwogIHRoZW1lX2J3KCkgKyAKICB4bGFiKCJGaXNoZXJUZXN0IFN0cmFuZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKDYwKSwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0iZm9yZXN0Z3JlZW4iKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygxMCksIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG91ciA9Im9yYW5nZXJlZDIiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZm9yZXN0Z3JlZW4iLCAicm95YWxibHVlMiIsICJvcmFuZ2VyZWQyIikpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoImZvcmVzdGdyZWVuIiwgInJveWFsYmx1ZTIiLCAib3JhbmdlcmVkMiIpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1LCBjb2xvdXIgPSAiYmxhY2siKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpKQpgYGAKCgojIyMgSU5ERUwKClRoZSB0b3RhbCBudW1iZXIgb2YgdmFyaWFudHMgZmlsdGVyZWQgYnkgRlMgZm9yIFNOUDogCgogICogbGVuaWVudDogYHIgbnJvdyhGU19JTkRFTCkgLSBucm93KEZTX1NOUF9sZW5pZW50X2ZpbHRlcmVkKWAgdGhhdCBjb3JyZXNwb25kIHRvOiBgciAobnJvdyhGU19JTkRFTCkgLSBucm93KEZTX0lOREVMX2xlbmllbnRfZmlsdGVyZWQpKSAvIG5yb3coRlNfSU5ERUwpICogMTAwYCUKICAKICAqIHN0cmluZ2VudDogYHIgbnJvdyhGU19JTkRFTCkgLSBucm93KEZTX0lOREVMX3N0cmluZ2VudF9maWx0ZXJlZClgIHRoYXQgY29ycmVzcG9uZCB0bzogYHIgKG5yb3coRlNfSU5ERUwpIC0gbnJvdyhGU19JTkRFTF9zdHJpbmdlbnRfZmlsdGVyZWQpKSAvIG5yb3coRlNfSU5ERUwpICogMTAwYCUKCmBgYHtyIEZTX0lOREVMX2FsbCwgY29tbWVudD1OQSwgZWNobz1GQUxTRX0KRlNfSU5ERUwkdHlwZSA8LSAicmF3IgpGU19JTkRFTF9sZW5pZW50JHR5cGUgPC0gImxlbmllbnQiCkZTX0lOREVMX3N0cmluZ2VudCR0eXBlIDwtICJzdHJpbmdlbnQiCkZTX0lOREVMX2FsbCA8LSByYmluZChGU19JTkRFTCwgRlNfSU5ERUxfbGVuaWVudCwgRlNfSU5ERUxfc3RyaW5nZW50KQoKZ2dwbG90KEZTX0lOREVMX2FsbCwgYWVzKFY1LCBmaWxsPXR5cGUsIGNvbG91cj10eXBlKSkgKyAKICBnZW9tX2RlbnNpdHkoYWxwaGE9MC4yKSArIAogIHNjYWxlX3hfY29udGludW91cyh0cmFucz0nbG9nMTAnKSArCiAgdGhlbWVfYncoKSArIAogIHhsYWIoIkZpc2hlclRlc3QgU3RyYW5kIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGMoNjApLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJmb3Jlc3RncmVlbiIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKDEwKSwgbGluZXR5cGU9ImxvbmdkYXNoIiwgY29sb3VyID0ib3JhbmdlcmVkMiIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJmb3Jlc3RncmVlbiIsICJyb3lhbGJsdWUyIiwgIm9yYW5nZXJlZDIiKSkgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiZm9yZXN0Z3JlZW4iLCAicm95YWxibHVlMiIsICJvcmFuZ2VyZWQyIikpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGNvbG91ciA9ICJibGFjayIpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSkpCmBgYAoKCiMjIFJlYWQgUG9zaXRpb24gUmFuayBTdW0gVGVzdAoKYGBge3IgUlNUX1NOUF9maWx0ZXJpbmdfc3RhdHMsIGNvbW1lbnQ9TkEsIGVjaG89RkFMU0V9ClJTVF9TTlBfbGVuaWVudF9maWx0ZXJlZCA8LSBzdWJzZXQoUlNUX1NOUCwgVjUgPiAtOCAmIFY1IDwgOCkKUlNUX1NOUF9zdHJpbmdlbnRfZmlsdGVyZWQgPC0gc3Vic2V0KFJTVF9TTlAsIFY1ID4gLTQgJiBWNSA8IDQpCmBgYAogIApgYGB7ciBSU1RfSU5ERUxfZmlsdGVyaW5nX3N0YXRzLCBjb21tZW50PU5BLCBlY2hvPUZBTFNFfQpSU1RfSU5ERUxfbGVuaWVudF9maWx0ZXJlZCA8LSBzdWJzZXQoUlNUX0lOREVMLCBWNSA+IC04ICYgVjUgPCA4KQpSU1RfSU5ERUxfc3RyaW5nZW50X2ZpbHRlcmVkIDwtIHN1YnNldChSU1RfSU5ERUwsIFY1ID4gLTQgJiBWNSA8IDQpCmBgYAoKIyMjIFNOUAoKVGhlIHRvdGFsIG51bWJlciBvZiB2YXJpYW50cyBmaWx0ZXJlZCBieSBSU1QgZm9yIFNOUDogCgogICogbGVuaWVudDogYHIgbnJvdyhSU1RfU05QKSAtIG5yb3coUlNUX1NOUF9sZW5pZW50X2ZpbHRlcmVkKWAgdGhhdCBjb3JyZXNwb25kIHRvOiBgciAobnJvdyhSU1RfU05QKSAtIG5yb3coUlNUX1NOUF9sZW5pZW50X2ZpbHRlcmVkKSkgLyBucm93KFJTVF9TTlApICogMTAwYCUKICAKICAqIHN0cmluZ2VudDogYHIgbnJvdyhSU1RfU05QKSAtIG5yb3coUlNUX1NOUF9zdHJpbmdlbnRfZmlsdGVyZWQpYCB0aGF0IGNvcnJlc3BvbmQgdG86IGByIChucm93KFJTVF9TTlApIC0gbnJvdyhSU1RfU05QX3N0cmluZ2VudF9maWx0ZXJlZCkpIC8gbnJvdyhSU1RfU05QKSAqIDEwMGAlCgpgYGB7ciBSU1RfU05QX2FsbCwgY29tbWVudD1OQSwgZWNobz1GQUxTRX0KUlNUX1NOUCR0eXBlIDwtICJyYXciClJTVF9TTlBfbGVuaWVudCR0eXBlIDwtICJsZW5pZW50IgpSU1RfU05QX3N0cmluZ2VudCR0eXBlIDwtICJzdHJpbmdlbnQiClJTVF9TTlBfYWxsIDwtIHJiaW5kKFJTVF9TTlAsIFJTVF9TTlBfbGVuaWVudCwgUlNUX1NOUF9zdHJpbmdlbnQpCgpnZ3Bsb3QoUlNUX1NOUF9hbGwsIGFlcyhWNSwgZmlsbD10eXBlLCBjb2xvdXI9dHlwZSkpICsgCiAgZ2VvbV9kZW5zaXR5KGFscGhhPTAuMikgKyAKICB0aGVtZV9idygpICsgCiAgeGxhYigiUmVhZCBQb3NpdGlvbiBSYW5rIFN1bSBUZXN0IikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGMoLTgsOCksIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG91ciA9ImZvcmVzdGdyZWVuIikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGMoLTQsNCksIGxpbmV0eXBlPSJsb25nZGFzaCIsIGNvbG91ciA9Im9yYW5nZXJlZDIiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZm9yZXN0Z3JlZW4iLCAicm95YWxibHVlMiIsICJvcmFuZ2VyZWQyIikpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoImZvcmVzdGdyZWVuIiwgInJveWFsYmx1ZTIiLCAib3JhbmdlcmVkMiIpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1LCBjb2xvdXIgPSAiYmxhY2siKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpKQpgYGAKCgojIyMgSU5ERUwKClRoZSB0b3RhbCBudW1iZXIgb2YgdmFyaWFudHMgZmlsdGVyZWQgYnkgUlNUIGZvciBTTlA6IAoKICAqIGxlbmllbnQ6IGByIG5yb3coUlNUX0lOREVMKSAtIG5yb3coUlNUX0lOREVMX2xlbmllbnRfZmlsdGVyZWQpYCB0aGF0IGNvcnJlc3BvbmQgdG86IGByIChucm93KFJTVF9JTkRFTCkgLSBucm93KFJTVF9JTkRFTF9sZW5pZW50X2ZpbHRlcmVkKSkgLyBucm93KFJTVF9JTkRFTCkgKiAxMDBgJQogIAogICogc3RyaW5nZW50OiBgciBucm93KFJTVF9JTkRFTCkgLSBucm93KFJTVF9JTkRFTF9zdHJpbmdlbnRfZmlsdGVyZWQpYCB0aGF0IGNvcnJlc3BvbmQgdG86IGByIChucm93KFJTVF9JTkRFTCkgLSBucm93KFJTVF9JTkRFTF9zdHJpbmdlbnRfZmlsdGVyZWQpKSAvIG5yb3coUlNUX0lOREVMKSAqIDEwMGAlCgpgYGB7ciBSU1RfSU5ERUxfYWxsLCBjb21tZW50PU5BLCBlY2hvPUZBTFNFfQpSU1RfSU5ERUwkdHlwZSA8LSAicmF3IgpSU1RfSU5ERUxfbGVuaWVudCR0eXBlIDwtICJsZW5pZW50IgpSU1RfSU5ERUxfc3RyaW5nZW50JHR5cGUgPC0gInN0cmluZ2VudCIKUlNUX0lOREVMX2FsbCA8LSByYmluZChSU1RfSU5ERUwsIFJTVF9JTkRFTF9sZW5pZW50LCBSU1RfSU5ERUxfc3RyaW5nZW50KQoKZ2dwbG90KFJTVF9JTkRFTF9hbGwsIGFlcyhWNSwgZmlsbD10eXBlLCBjb2xvdXI9dHlwZSkpICsgCiAgZ2VvbV9kZW5zaXR5KGFscGhhPTAuMikgKyAgCiAgdGhlbWVfYncoKSArIAogIHhsYWIoIlJlYWQgUG9zaXRpb24gUmFuayBTdW0gVGVzdCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKC04LDgpLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJmb3Jlc3RncmVlbiIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBjKC00LDQpLCBsaW5ldHlwZT0ibG9uZ2Rhc2giLCBjb2xvdXIgPSJvcmFuZ2VyZWQyIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImZvcmVzdGdyZWVuIiwgInJveWFsYmx1ZTIiLCAib3JhbmdlcmVkMiIpKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJmb3Jlc3RncmVlbiIsICJyb3lhbGJsdWUyIiwgIm9yYW5nZXJlZDIiKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSwgY29sb3VyID0gImJsYWNrIiksIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSkKYGBgCgoKCg==